2.9.2. 命令行参数(Command Line Arguments)

通过读取命令行参数可以使程序变得更加通用,这些参数作为用户输入的运行二进制可执行程序的命令的一部分包含在内。它们指定更改程序运行时行为的输入值或选项。换句话说,使用不同的命令行参数值运行程序会导致程序的行为在不同的运行中发生变化,而无需修改程序代码并重新编译它。例如,如果程序将输入文件名的名称作为命令行参数,则用户可以使用任何输入文件名运行它,而不是在代码中引用特定输入文件名的程序。

用户提供的任何命令行参数都会作为参数值传递给main函数。要编写接受命令行参数的程序,main函数的定义必须包含两个参数:argcargv

int main(int argc, char *argv[]) { ...

请注意,第二个参数的类型也可以表示为char **argv

第一个参数 argc 存储参数计数。它的值表示传递给主函数的命令行参数的数量(包括程序的名称)。例如,如果用户输入

./a.out 10 11 200

那么argc将保存值 4(a.out算作第一个命令行参数,1011200算作其他三个参数)。

第二个参数 argv 存储参数向量。它包含每个命令行参数的值。每个命令行参数都作为字符串值传入,因此argv的类型是一个字符串数组(或一个char数组)。 argv 数组包含 argc + 1 个元素。第一个argc元素存储命令行参数字符串,最后一个元素存储NULL,表示命令行参数列表的结尾。例如,在上面输入的命令行中,argv数组将类似于图 1

an example argv list with 5 elements, one for the 3 input values (10, 11, 200) plus the executable as the first element, and NULL as the last.

图 1. 传递给 main 的 argv 参数是一个字符串数组。每个命令行参数都作为数组中的单独字符串元素传递。最后一个元素的值为 NULL,表示命令行参数列表的末尾。

数组中的字符串argv不可变的,这意味着它们存储在只读内存中。因此,如果程序想要修改其命令行参数之一的值,则需要制作命令行参数的本地副本并修改该副本。

通常,程序希望将传递给main的命令行参数解释为字符串以外的类型。在上面的示例中,程序可能想要从其第一个命令行参数的字符串值"10"中提取整数值10。 C 的标准库提供了将字符串转换为其他类型的函数。例如,atoi(“a to i”,表示“ASCII 到整数”)函数将数字字符串转换为其相应的整数值:

int x;
x = atoi(argv[1]);  // x gets the int value 10

有关这些函数的更多信息,请参阅 2.6. 字符串和字符串库。 CommandLineargs.c程序 是 C 命令行参数的另一个示例。